package main.leetcode.offer.firstround.from03to50;

/**
 * 20.表示数值的字符串
 *
 * <p>请实现一个函数用来判断字符串是否表示数值（包括整数和小数）。例如，字符串"+100"、"5e2"、"-123"、"3.1416"、"0123"及"-1E-16"都表示数值，但"12e"、"1a3.14"、"1.2.3"、"+-5"及"12e+5.4"都不是。
 *
 * <p>来源：力扣（LeetCode） 链接：https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class ex20 {
    public static void main(String[] args) {
        System.out.println(new ex20().isNumber("1 "));
    }

    //  // 失 败 暴 力 法
    //  public boolean isNumber(String s) {
    //    s = s.trim();
    //    if (s.isEmpty()) return false;
    //    boolean dot = false; // 已出现过'.'
    //    boolean e = false; // 已出现过'e'
    //    char c;
    //    int n = s.length();
    //    for (int i = 0; i < n; i++) {
    //      c = s.charAt(i);
    //      if (c >= '0' && c <= '9') continue;
    //      if (c == 'e' || c == 'E') {
    //        if (e || i == 0 || s.charAt(i - 1) > '9' || s.charAt(i - 1) < '0' || i == n - 1)
    //          return false;
    //        e = true;
    //      } else if (c == '.') {
    //        if (e
    //            || dot
    //            || i == 0
    //                && (i == n - 1 || s.charAt(i + 1) > '9' || s.charAt(i + 1) < '0' // .
    // 排在第一位且后面无数字
    //                )) return false;
    //        dot = true;
    //      } else if (c == '+' || c == '-') {
    //        if ((i == 0 || s.charAt(i - 1) == 'e' || s.charAt(i - 1) == 'E')
    //            && (i != n - 1 && (s.charAt(i + 1) < '9' || s.charAt(i + 1) > '0'))) continue;
    //        return false;
    //      } else return false;
    //    }
    //    return true;
    //  }

    public boolean isNumber(String s) {
        s = s.trim();
        return s.matches("[+-]?([0-9]+(\\.[0-9]*)?|\\.[0-9]+)(e[+-]?[0-9]+)?");
    }
}
